package com.dxf.chepter10

/**
 *  函数柯里化:
 *    1 函数编程中 ,接受多个参数的函数都可以转化为接受单个参数的函数,这个转化叫 柯里化
 *    2 柯里化就是证明函数只需要一个参数而已,
 *    3 不用设立 柯里化存在意义 的命题,柯里化就是以函数为主体这种思想发展的必然产生结果
 *
 *    思想:
 *      把任务分解成单个的任务,
 *      参数一个一个传入
 *
 *
 */
object T130_函数柯里化2 {

  def main(args: Array[String]): Unit = {
    //一个函数,可以接受两个字符串,忽略大小写比较是否相等
    def eq(str1: String, str2: String): Boolean = {
      str1 == str2
    }

    //隐式函数 构造方法传入的this,相当于扩展了String类,在String类下再加一个checkEq 方法
    implicit class TestEq(str: String) {
      def checkEq(ss: String)(f: (String, String) => Boolean): Boolean = {
        f(str.toLowerCase(), ss.toLowerCase())
      }
    }
    val functionToBoolean: ((String, String) => Boolean) => Boolean = "hello".checkEq("HellO")
   // val functionToBoolean: ((String, String) => Boolean) => Boolean = {"hello".checkEq("HellO")} // => 返回值 = {} , {}可以省略
    println(functionToBoolean(eq _))

    val bool: Boolean = "hello".checkEq("HellO~")(eq _)
    println(bool)

    //===========================
    //简写形式
    // (_==_)) 的演变  (str1: String, str2: String) =>  str1 == str2 简化 为 (str1,str2) => str1 ==str2 再简化为 _==_
    println("hello".checkEq("HellO")(_ == _))

    println(new String("abc") == "abc")
    val str = new String("abc")
    println(str == "abc")


  }


}
